package com.sz.common.core.system.service;

import com.sz.common.base.dto.QResultDto;
import com.sz.common.base.dto.ResultDto;
import com.sz.common.base.exception.BizException;
import com.sz.common.core.service.role.IRoleMemberService;
import com.sz.common.core.system.dto.OrgUserDto;
import com.sz.common.core.system.dto.UserChangePasswordDto;
import com.sz.common.core.system.dto.UserDto;
import com.sz.common.core.system.entity.User;
import com.sz.common.core.system.entity.UserDetail;
import com.sz.common.core.system.entity.UserOrg;

import java.text.ParseException;
import java.util.List;

/**
 * Function: UserRoleService <br>
 * Author: Charles <br>
 * Date: 2017-10-18 10:51:00
 */
public interface UserService extends IRoleMemberService {
    String MEMBERSHIP_TYPE_NAME = "USER";

    /**
     * @param userDto 用户对象
     * @return int
     * @throws BizException
     * @throws ParseException
     */
    int saveUser(UserDto userDto) throws BizException, ParseException;

    /**
     * 按过滤条件查询用户列表
     *
     * @param locked
     * @param orgid
     * @param q
     * @param isIncludeSubOrg 是否包含子组织的用户
     * @param page
     * @param pageSize
     * @return
     */
    ResultDto findByFilterListPage(int orgid, int locked, String q, boolean isIncludeSubOrg, int page, int pageSize);

    /**
     * 按过滤条件查询用户列表
     *
     * @param locked
     * @param orgid
     * @param q
     * @param isIncludeSubOrg 是否包含子组织的用户
     * @param page
     * @param pageSize
     * @return
     */
    ResultDto findByFilterNameOrIdListPage(int orgid, int locked, String q, boolean isIncludeSubOrg, int page, int pageSize);

    /**
     * @param userDto
     * @return
     * @throws ParseException
     */
    int updateUser(int userId, UserDto userDto) throws ParseException;

    /**
     * @param userId
     */
    void deleteUserById(Integer userId);

    /**
     * @param userIds
     */
    void lockUserByUserIds(List<Integer> userIds);

    /**
     * @param userIds
     */
    void unLockUserByUserIds(List<Integer> userIds);

    /**
     * @param id
     * @return
     */
    UserDto getUserById(int id);

    /**
     * @param userid
     * @param roleId
     */
    void removeUserRole(int userid, int roleId);

    /**
     * @param targetOrgId
     * @param userIds
     */
    void moveUsersOrg(int targetOrgId, String[] userIds);

    /**
     * @param userChangePasswordDto
     */
    void changePassword(int userId, UserChangePasswordDto userChangePasswordDto);

    /**
     * @param userIds
     */
    void resetUsersPasswd(List<Integer> userIds);

    /**
     * @param userids
     */
    void deleteUsersById(String[] userids);

    /**
     * 校验工号
     *
     * @param code
     */
    void userCodeCheck(String code);

    /**
     * 校验邮件
     *
     * @param userId
     * @param email
     */
    void userEmailCheck(int userId, String email);

    /**
     * 获取用户的组织+用户组
     *
     * @param userId
     */
    List<UserOrg> getOrgByUserId(int userId);

    /**
     * 模糊匹配可用用户
     *
     * @param q
     */
    ResultDto findByFilter(String q);

    /**
     * 根据用户账号模糊匹配
     *
     * @param q
     * @return
     */
    ResultDto findByCodeLike(String q);


    List<User> findByIds(List<Integer> ids);

    /**
     * 模糊匹配可用用户-bd
     *
     * @param q
     */
    ResultDto findBdsByFilter(String q, int pageIndex, int pageSize);

    /**
     * 通过组的code 数据匹配用户
     *
     * @param orgCode
     * @return
     */
    List<OrgUserDto> findUserByOrgCode(String orgCode);

    /**
     * 查询用户的明细
     */
    UserDto findUserDetailByUserId(int userId);

    /**
     * 查询用户的基本信息
     */
    UserDetail getSimpleUserById(int userId);

    /**
     * 通过q 去查询
     *
     * @param orgCode
     * @param page
     * @param pageSize
     * @return
     */
    QResultDto findByFilterOrgCodeListPage(String orgCode, String q, int page, int pageSize);

    /**
     * 根据用户组织编码查询，当前组织或分组下面所有的用户
     *
     * @param orgCode 用户组或组织的code
     *                public static final String CUS_BUS_CONTACT_SYS_GROUP_SALES = "SYS-GROUP-SALES";//销售
     *                public static final String CUS_BUS_CONTACT_SYS_GROUP_FD = "SYS-GROUP-FD";//财务
     *                public static final String CUS_BUS_CONTACT_SYS_GROUP_CSD = "SYS-GROUP-CSD";//客服
     * @return 集合
     */
    List<UserOrg> findByOrgCode(String orgCode);

    /**
     * 根据组织或分组查询，当前组织或分组下面随机的一个用户,并返回userid
     * @param orgCode public static final String CUS_BUS_CONTACT_SYS_GROUP_SALES = "SYS-GROUP-SALES";//销售
     *                public static final String CUS_BUS_CONTACT_SYS_GROUP_FD = "SYS-GROUP-FD";//财务
     *                public static final String CUS_BUS_CONTACT_SYS_GROUP_CSD = "SYS-GROUP-CSD";//客服
     * @return
     */
    int findRandomUserIdByOrgCode(String orgCode);

    ResultDto findShortListPage(String q, int pageIndex, int pageSize);
}
